package com.ld.poetry.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ld.poetry.aop.LoginCheck;
import com.ld.poetry.aop.SaveCheck;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.constants.CommonConst;
import com.ld.poetry.dao.ResourcePathMapper;
import com.ld.poetry.entity.ResourcePath;
import com.ld.poetry.vo.ResourcePathVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 资源聚合里的音乐，其他接口在ResourceAggregationController
 * </p>
 *
 * @author sara
 * @since 2021-09-14
 */
@RestController
@RequestMapping("/webInfo")
public class MusicController {

    @Autowired
    private ResourcePathMapper resourcePathMapper;

    /**
     * 查询音乐列表
     * 
     * 功能说明：
     * 1. 获取所有已审核通过的音乐资源
     * 2. 按分类统计每个分类下的音乐数量
     * 3. 返回分类及其对应的音乐数量
     * 
     * 返回数据：
     * @return PoetryResult<List<Map<String, Object>>> 
     *   - 每个Map包含两个字段：
     *     - classify: 音乐分类名称
     *     - count: 该分类下的音乐数量
     * 
     * 数据结构示例：
     * [
     *   {
     *     "classify": "流行音乐",
     *     "count": 10
     *   },
     *   {
     *     "classify": "古典音乐",
     *     "count": 5
     *   }
     * ]
     * 
     * 注意事项：
     * 1. 只返回已审核通过的音乐（status = true）
     * 2. 按分类进行分组统计
     * 3. 返回结果按分类名称排序
     */
    @GetMapping("/listFunny")
    public PoetryResult<List<Map<String, Object>>> listFunny() {
        // 创建查询条件构建器
        QueryWrapper<ResourcePath> queryWrapper = new QueryWrapper<>();
        
        // 设置查询条件：
        // 1. 选择需要查询的字段：分类名称和数量统计
        // 2. 只查询已审核通过的音乐（status = true）
        // 3. 只查询音乐类型的资源（type = 'funny'）
        // 4. 按分类名称进行分组
        queryWrapper.select("classify, count(*) as count")
                .eq("status", Boolean.TRUE)
                .eq("type", CommonConst.RESOURCE_PATH_TYPE_FUNNY)
                .groupBy("classify");
                
        // 执行查询并返回结果
        List<Map<String, Object>> maps = resourcePathMapper.selectMaps(queryWrapper);
        return PoetryResult.success(maps);
    }

    /**
     * 保存音乐资源
     * 
     * 功能说明：
     * 1. 保存新的音乐资源到数据库
     * 2. 需要用户登录权限
     * 3. 需要进行保存检查
     * 
     * 请求参数：
     * @param resourcePathVO 音乐资源信息对象，包含以下字段：
     *   - classify: 音乐分类（必填）
     *   - cover: 音乐封面图片（必填）
     *   - url: 音乐资源地址（必填）
     *   - title: 音乐标题（必填）
     * 
     * 返回结果：
     * @return PoetryResult 操作结果
     *   - 成功：返回成功信息
     *   - 失败：返回错误信息（如：信息不全）
     * 
     * 处理流程：
     * 1. 验证必填字段是否完整
     * 2. 创建新的音乐资源对象
     * 3. 设置音乐资源属性：
     *    - type: 设置为音乐类型
     *    - status: 初始状态为未审核
     * 4. 保存到数据库
     * 
     * 注意事项：
     * 1. 需要用户登录才能操作
     * 2. 所有必填字段不能为空
     * 3. 新添加的音乐默认状态为未审核
     * 4. 音乐资源需要管理员审核后才能显示
     */
    @LoginCheck
    @SaveCheck
    @PostMapping("/saveFunny")
    public PoetryResult saveFunny(@RequestBody ResourcePathVO resourcePathVO) {
        // 验证必填字段是否完整
        if (!StringUtils.hasText(resourcePathVO.getClassify()) || !StringUtils.hasText(resourcePathVO.getCover()) ||
                !StringUtils.hasText(resourcePathVO.getUrl()) || !StringUtils.hasText(resourcePathVO.getTitle())) {
            return PoetryResult.fail("信息不全！");
        }

        // 创建新的音乐资源对象
        ResourcePath funny = new ResourcePath();
        
        // 设置音乐资源属性
        funny.setClassify(resourcePathVO.getClassify());  // 设置音乐分类
        funny.setTitle(resourcePathVO.getTitle());       // 设置音乐标题
        funny.setCover(resourcePathVO.getCover());       // 设置音乐封面
        funny.setUrl(resourcePathVO.getUrl());           // 设置音乐资源地址
        funny.setType(CommonConst.RESOURCE_PATH_TYPE_FUNNY);  // 设置类型为音乐
        funny.setStatus(Boolean.FALSE);                  // 设置初始状态为未审核

        // 保存到数据库
        resourcePathMapper.insert(funny);
        return PoetryResult.success();
    }
}
